/*
Dominique Jannone
Guillaume Marre
Yohan Ojeda
Laurent Schiavon
*/
package model;

import java.io.IOException;
import java.net.InetSocketAddress;
import java.net.Socket;
import java.nio.channels.ClosedByInterruptException;
import java.nio.channels.ServerSocketChannel;
import java.util.concurrent.ExecutorService;
import java.util.logging.Level;
import java.util.logging.Logger;

import javax.media.rtp.InvalidSessionAddressException;
import javax.media.rtp.RTPManager;

import Econf_Audio.RTPServeur;

class CanalAnnonceurHandler  extends Thread{
	
	// log
		public static final Logger logger = Logger.getLogger(ConnexionDb.class.getName());

	// Attributs
	private ServerSocketChannel serverSocket;
	private final ExecutorService pool;
	private Object[][] tabIDetRTPServeur;
	private int incrPort;

	// Observateurs
	public Object[][] getTabIDetRTPServeur() {
		return tabIDetRTPServeur;
	}
	public int getIncrPort() {
		return incrPort;
	}
	// Mutateur
	public void setTabIDetRTPServeur(Object[][] tabIDetRTPServeurTMP) {
		int tailleL = tabIDetRTPServeurTMP.length;
		int tailleC = tabIDetRTPServeurTMP[0].length;
		this.tabIDetRTPServeur  = new Object[tailleL][tailleC];
		this.tabIDetRTPServeur = tabIDetRTPServeurTMP;
	}
	public void setTabIDetRTPServeurNull() {
		this.tabIDetRTPServeur = null;
	}
	
	// Constructeurs
	CanalAnnonceurHandler(int port, ExecutorService pool){
		logger.log(Level.INFO,"Start CanalAnnonceurHandler on port " + port);
	    this.pool = pool;
	    incrPort = 0;
//	    try {
////		serverSocket = ServerSocketChannel.open();
////		serverSocket.socket().bind(new InetSocketAddress(port));
//	    }catch(IOException e){ 
//	    	MainServer.logger.log(Level.SEVERE,""+e); 
//		System.exit(1);
		
		// Création d'un tableau qui list l'ensemble des conférences (ID) avec la ref du rtpManager
//	    }
	
	}

	public void run(){
	    try {
	    	
		while (MainServer.isServerOn()) {
		}
	    } catch (Exception ex) {  logger.log(Level.SEVERE,""+ex); logger.log(Level.SEVERE,ex.getClass() + ": " +  ex.getMessage(), ex); }
	}
	
	// méthodes
	public RTPServeur nouvelleConferenceRTPServeur(String idConf, int portLocalR, int portLocalE, int portEmission) throws InvalidSessionAddressException, IOException{
		// increment Port
		incrPort = incrPort+10;
		logger.log(Level.INFO,"portLocalR: "+portLocalR+" portLocalE: "+portLocalE+" portEmission: "+portEmission);		
		// Instancie une nouvelle conférence
			RTPServeur mgr; 
				mgr = new RTPServeur("localhost", portLocalR, portLocalE, portEmission, idConf);
		// add la référence de la conf et l'ajout dans le tabIdetRTPServer
			if (tabIDetRTPServeur != null){
				Object[][] tabIDetRTPServeurTMP = new Object[tabIDetRTPServeur.length+1][tabIDetRTPServeur[0].length];
				for (int i = 0; i < tabIDetRTPServeur.length; i++) {
					for (int j = 0; j < tabIDetRTPServeur[i].length; j++) {
						tabIDetRTPServeurTMP[i][j]=tabIDetRTPServeur[i][j];
					}
				}
				// Ajout dans la derniere ligne
				tabIDetRTPServeurTMP[tabIDetRTPServeur.length][0] = idConf;
				tabIDetRTPServeurTMP[tabIDetRTPServeur.length][1] = mgr;
				tabIDetRTPServeurTMP[tabIDetRTPServeur.length][2] = portLocalR;
				tabIDetRTPServeurTMP[tabIDetRTPServeur.length][3] = portLocalE;
				tabIDetRTPServeurTMP[tabIDetRTPServeur.length][4] = portEmission;
				setTabIDetRTPServeur(tabIDetRTPServeurTMP);
				
			}else{
				Object[][] tabIDetRTPServeurTMP = new Object[1][5];
				tabIDetRTPServeurTMP[0][0] = idConf;
				tabIDetRTPServeurTMP[0][1] = mgr;
				tabIDetRTPServeurTMP[0][2] = portLocalR;
				tabIDetRTPServeurTMP[0][3] = portLocalE;
				tabIDetRTPServeurTMP[0][4] = portEmission;
				setTabIDetRTPServeur(tabIDetRTPServeurTMP);
			}
			
		return mgr;
	}
	
	


	public String getPortLocalRecepConf(String IDConf){
		for (int i = 0; i < tabIDetRTPServeur.length; i++) {
			//check si l'id de la conf est dans le tab
			if(tabIDetRTPServeur[i][0].equals(IDConf)){
				int portLocalR =  (Integer) tabIDetRTPServeur[i][2];
				String portlR = ""+portLocalR;
				return portlR;
			}
		}		
		return null;
	}
	
	public String getPortEmissionConf(String IDConf){
		for (int i = 0; i < tabIDetRTPServeur.length; i++) {
			//check si l'id de la conf est dans le tab
			if(tabIDetRTPServeur[i][0].equals(IDConf)){
				int portEmission =  (Integer) tabIDetRTPServeur[i][4];
				String portEm = ""+portEmission;
				return portEm;
			}
		}		
		return null;
	}
	
	public RTPServeur getMgrAvecIdConf(String IDConf){
		for (int i = 0; i < tabIDetRTPServeur.length; i++) {
			//check si l'id de la conf est dans le tab
			if(tabIDetRTPServeur[i][0].equals(IDConf)){
				RTPServeur mgr = (RTPServeur) tabIDetRTPServeur[i][1];
				return mgr;
			}
		}		
		return null;
	}
	
	public void delIdConfInTabIdManager(String idConf){
		// Supprime l'id du tabIDetRTPServeur
		if (tabIDetRTPServeur != null && tabIDetRTPServeur.length > 1){
			Object[][] tabIDetRTPServeurTMP = new Object[tabIDetRTPServeur.length-1][tabIDetRTPServeur[0].length];
			for (int i = 0; i < tabIDetRTPServeur.length; i++) {
				if (!tabIDetRTPServeur[i][0].equals(idConf)){
					for (int k = 0; k < tabIDetRTPServeurTMP[i].length; k++) {
						tabIDetRTPServeurTMP[i][k]=tabIDetRTPServeur[i][k];
					}
				}
			}
			setTabIDetRTPServeur(tabIDetRTPServeurTMP);
		}else{
			setTabIDetRTPServeurNull();
		}
	}
	

	
	

 }